package org.zoomdev.zoom.dao;

import org.zoomdev.zoom.dao.adapters.DataAdapter;

public interface EntityBuilder {


    /**
     * 指定Entity类型
     *
     * @param type
     * @return
     */
    EntityBuilder type(Class<?> type);

    /**
     * 指定对应的表
     *
     * @param table
     * @return
     */
    EntityBuilder table(String table);


    /**
     * 增加join项目
     *
     * @param table
     * @param on
     * @return
     */
    EntityBuilder innerJoin(String table, String on);


    EntityBuilder leftJoin(String table, String on);

    EntityBuilder rightJoin(String table, String on);

    /**
     * 设置字段忽略
     *
     * @param fieldName
     * @return
     */
    EntityBuilder ignore(String fieldName);


    /**
     * 关联实体类字段到数据库字段
     * 只针对实体类有效，对Record模式无效
     *
     * @param fieldName
     * @param columnName
     * @return
     */
    EntityBuilder link(String fieldName, String columnName);


    /**
     * 关联实体类字段到数据库字段
     * 只针对实体类有效，对Record模式无效
     *
     * @param fieldName
     * @param columnName
     * @return
     */
    EntityBuilder link(String fieldName, String columnName, DataAdapter adapter);

    /**
     * 针对Record,如果设置了，则在关联表查询的时候，关联表的字段的key为 table.column
     * 例如:
     *
     * <pre>
     *
     *  Entity<Record> entity = dao.entityFactory().builder().table("user u")
     *                 .innerJoin("collection c", "u.user_id=c.user_id")
     *                 .dotStyle()
     *                 .build();
     *
     *  List<Record> records = dao.ar(entity).find();
     *
     *  Record的结构为:
     *
     *  {
     *      userId  =>   1,
     *      c.userId  =>  1,
     *  }
     *
     *  </pre>
     *
     * @return
     */
    EntityBuilder dotStyle();


    Entity build();
}
